package so.obligatorio;

import java.util.ArrayList;
import java.util.List;

import so.obligatorio.procesos.Cliente;
import so.obligatorio.procesos.Proceso;

public class Reloj extends Thread {
	private boolean keepRunning;
	private Integer turno;
	private static Reloj instance = null;
	private List<Proceso> procesos = null;
	private String procesosTurnos = "";
	private String[] lineasArchivo;

	private Reloj() {
		this.turno = 0; 
		this.procesos = new ArrayList<Proceso>();
		keepRunning = true;
	}

	public static Reloj getInstance() {
		if(instance == null) {
			instance = new Reloj();
		}
		return instance;
	}

	public void registrar(Proceso proceso) {
		this.procesos.add(proceso);
	}

	@Override
	public void run() {
//		System.out.println("Inicia turno " + this.turno);
		while(keepRunning) {
			if(pasoTurno()) {
				this.turno++;
				//Se envejecen los clientes en las colas
				ManejadorColas.getInstance().envejecer();
				//Se agregan mas clientes desde la lista de entrada
				ManejadorColas.getInstance().procesarClientes(10);
//				System.out.println("Inicia turno " + this.turno);
			}
		}
		System.out.println("FIN DE LA SIMULACION");

		System.out.println("Generando Achivo de Salida");
		for(Proceso key : procesos) {
			//despierta los hilos que hubiesen quedado esperando por un nuevo turno
			key.continuar();
		}
		
		//Obtengo clientes terminados para calcular cantidad de turnos que demoro
		List<Cliente> clientesTerminados = ManejadorColas.getInstance().getClientesTerminados();
		lineasArchivo = new String[clientesTerminados.size()];
		int turnosDemoro = 0;
		
		for(int indice = 0; indice<clientesTerminados.size(); indice++)
		{
			Cliente cliente = clientesTerminados.get(indice);
			turnosDemoro = cliente.getTurnoSalida() -cliente.getTurnoEntrada();
			procesosTurnos = cliente.getTipoCliente() + "\t"+ turnosDemoro + "\t" + cliente.getCedula();
			lineasArchivo[indice] = procesosTurnos;
			turnosDemoro = 0;
		}
		//Escribo los turnos resultantes por cliente en archivo 
		ManejadorArchivos manejador = new ManejadorArchivos();
		manejador.escribirArchivo("listaClientesTerminados.txt", lineasArchivo);
		
	}

	/**
	 * Indica si todos los proceso registrados ya ejecutaron una vez
	 * Si ya ejecutaron los despierta
	 * @return
	 */
	private boolean pasoTurno() {
		boolean flag = true;
		for(Proceso key : procesos) {
//			System.out.println("Preguntando por " + key.getName());
			flag = flag && key.terminoTurno();
			if(!flag) {
				break;
			} 
			if (!key.terminoTurno()) {
//				System.out.println(key.getName() + " no se fue a dormir");
			}
		}

		if(flag) {
			for(Proceso key : procesos) {
				//despierta el hilo
				key.continuar();
			}
		}
		return flag;
	}

	public boolean isKeepRunning() {
		return keepRunning;
	}

	public void setKeepRunning(boolean keepRunning) {
		this.keepRunning = keepRunning;
	}

	public Integer getTurno() {
		return turno;
	}
}
